﻿// opticalFlowEstimation.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"   
#include"opencv2/xfeatures2d.hpp" 
using namespace cv;
using namespace std;
using namespace xfeatures2d;
int main()
{
	char fn[] = "C:\\opencv\\sources\\samples\\data\\vtest.avi";
	VideoCapture capture(fn);
	Mat source, gray, lastgray, result;
	vector<Point2f> points[2], temp;
	vector<uchar> status;
	vector<float>err;
	bool stop(false);
	int MAX_POINT_POINTS = 100;
	while (!stop) {
		if (!capture.read(source))
			break;
		cvtColor(source, gray, COLOR_BGR2GRAY);
		if (points[0].size() < 10) {
			goodFeaturesToTrack(gray, points[0], MAX_POINT_POINTS, 0.01, 20);
		}
		if (lastgray.empty()) {
			gray.copyTo(lastgray);
		}
		calcOpticalFlowPyrLK(lastgray, gray, points[0], points[1], status, err);
		int counter = 0;
		source.copyTo(result);
		for (int i = 0; i < points[1].size(); i++) {
			line(result, points[0][i], points[1][i], Scalar(0, 0, 0xff));
			circle(result, points[1][i], 3, Scalar(0, 0, 0xff));
		}
		swap(points[0], points[1]);
		swap(lastgray, gray);
		imshow("原图像", source);
		imshow("结果", result);
		char key = waitKey(1000);
		if (key == 27) {
			break;
		}
	}
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门提示: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
